package com.learn.algorlthm;

import java.util.Stack;

/**
 * @description: 用两个栈实现队列
 * @author: yfpu(fengpu.yang @ ucarinc.com)
 * @Date: 2018-07-06 15:22
 * 用两个栈来实现一个队列，完成队列的Push和Pop操作。队列中的元素为int类型
 */
public class Learn09<T> {

    /**
     * in栈用来处理入栈（push）操作，out栈用来处理出栈（pop）操作。一个元素进入in栈之后，出栈的顺序被反转。
     * 当元素要出栈时，需要先进入out栈，此时元素出栈顺序再一次被反转，因此出栈顺序就和最开始入栈顺序是相同的，
     * 先进入的元素先退出，这就是队列的顺序
     */
    private  Stack<T> in = new Stack<>();
    private Stack<T> out = new Stack<>();


    public void push(T value) {
        in.push(value);
    }


    public T pop()  {
        if (out.isEmpty())
            while (!in.isEmpty())
                out.push(in.pop());
        if (out.isEmpty())
            throw new RuntimeException("queue is empty");

        return out.pop();
    }

    public boolean isEmpty() {
        boolean inEmpty = in.isEmpty();
        boolean outEmpty = this.out.isEmpty();
        return (inEmpty && outEmpty);
    }

}
